package TarryDAOS;

import Herramientas.Herramientas;
import Herramientas.PasarelaDatos;
import Herramientas.ResultSets;
import SistemaDTOS.UnidadMedidaDTO;
import TarryDTOS.ConceptoCompraDTO;
import TarryDTOS.ConceptoOrdenCompraDTO;
import TarryDTOS.OrdenCompraDTO;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Alan Gonzalez
 */
public class ComprasDAO {

    private ResultSets result;
    private PasarelaDatos db;

    public ComprasDAO() {
        result = new ResultSets();
        db = new PasarelaDatos();
    }

    /**
     * ALAN GONZALEZ COMPRUEBA SI EXSITE UN FOLIO DE ORDEN DE COMPRA
     *
     * @param folio
     * @return
     */
    public int existeFolio(int folio) {
        int bandera = 0;
        String sql = " SELECT * FROM  ordenes_compra where ordenes_compra.folio = " + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                bandera = 1;
            } else {
                bandera = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return bandera;
    }

    /**
     *
     * @param folio
     * @param proveedor
     * @param fechaEntrega
     */
    public void nuevaOrdenCompra(int folio, int proveedor, String fechaEntrega, String observaciones) {
        String sql = "";
        sql += " insert into ordenes_compra set ";
        sql += " ordenes_compra.folio= " + folio + ",";
        sql += " ordenes_compra.id_partner = " + proveedor + ",";
        sql += " ordenes_compra.fecha_creacion = now() ,";
        sql += " ordenes_compra.fecha_entrega = '" + fechaEntrega + "' ,";
        sql += " ordenes_compra.observaciones = '" + observaciones + "' ,";
        sql += " ordenes_compra.estado = 1;";
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * 0
     * ALAN GONZALEZ -- DEVUELVE LOS CONCEPTOS DE UNA ORDEN DE COMPRA
     *
     * @param folio
     * @return
     */
    public Vector conceptosCompra(int folio) {
        Vector conceptos = new Vector();
        String sql = "SELECT * FROM ordenes_compra_conceptos WHERE ordenes_compra_conceptos.folio = " + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                ConceptoCompraDTO c = new ConceptoCompraDTO();
                c = result.conceptoCompraDTO(rst);
                UnidadMedidaDTO unidad = new UnidadMedidaDTO();
                Herramientas h = new Herramientas();
                unidad = h.unidadMedida(c.getUm());
                c.setUmAbreviatura(unidad.getAbreviatura());
                conceptos.add(c);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return conceptos;
    }

    /**
     * ALAN GONZALEZ TODAS LAS ORDENES POR FOLIO
     *
     * @return
     */
    public Vector ordenesCompra() {
        Vector vOrdenCompra = new Vector();
        String sql = "SELECT * FROM ordenes_compra ORDER BY ordenes_compra.folio DESC";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                OrdenCompraDTO o = new OrdenCompraDTO();
                o = result.ordenCompraDTO(rst);
                o.setRazonSocialPartnerProveedor(this.razonSocialPrveedor(o.getIdPartner()));
                vOrdenCompra.add(o);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vOrdenCompra;
    }

    /**
     * ALAN GONZALEZ REGISTRAR CONCEPTO DE COMPRA
     */
    public void registroConcepto(ConceptoCompraDTO concept) {

        String sql = "";
        sql += " INSERT INTO ordenes_compra_conceptos ";
        sql += " SET";
        sql += " ordenes_compra_conceptos.folio = " + concept.getFolio();
        sql += " , ordenes_compra_conceptos.concepto = '" + concept.getConcepto() + "'";
        sql += " , ordenes_compra_conceptos.cantidad =  " + concept.getCantidad();
        sql += " , ordenes_compra_conceptos.um = " + concept.getUm();
        sql += " , ordenes_compra_conceptos.pu = " + concept.getPu();
        sql += " , ordenes_compra_conceptos.total_concepto =" + concept.getTotalConcepto();
        // EL SIGUIENTE FRAGMENTO SE CONTROLA DEPENDIENDO SI LA TAZA DE IVA ES MAYOR A 0  O NO  -->
        sql += " , ordenes_compra_conceptos.monto_iva =" + concept.getMontoIva();
        sql += " , ordenes_compra_conceptos.porcentaje_iva =" + concept.getPorcentajeIva();
        // EL SIGUIENTE FRAGMENTO SE CONTROLA DEPENDIENDO SI LA TAZA DE IVA ES MAYOR A 0  O NO  -->
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ | ESTE METODO ELIMINA TODA LA INFORMACION DE UNA ORDEN DE
     * COMPRA Y SUS RESPECTIVOS CONCEPTOS
     *
     * @param folio
     */
    public void eliminarOrdenCompra(int folio) {
        db.openDatabase();
        String sqlEliminaOrden
                = "DELETE FROM ordenes_compra WHERE ordenes_compra.folio = " + folio;
        String sqlEliminaConceptosOrden
                = "DELETE FROM ordenes_compra_conceptos WHERE ordenes_compra_conceptos.folio = " + folio;
        db.execute(sqlEliminaOrden);
        db.execute(sqlEliminaConceptosOrden);
        db.closeDatabase();
    }

    /**
     * ALAN GONZA ESTE METODO ELIMINA UN CONCEPTO DE ORDEN DE COMPRA
     *
     * @param id
     */
    public void eliminarConceptoOrdenCompra(int id) {
        String sqlEliminaConcepto = "DELETE FROM ordenes_compra_conceptos WHERE ordenes_compra_conceptos.id = " + id;
        db.openDatabase();
        db.execute(sqlEliminaConcepto);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ SUMA EL TOTAL DE LOS CONCEPTOS DE UNA ORDEN POR EL FOLIO
     *
     * @param folio
     * @return
     */
    public double totalConceptosOrdenCompra(int folio) {
        double total = 0.0;
        String sql = "select sum(ordenes_compra_conceptos.total_concepto) as total from ordenes_compra_conceptos where ordenes_compra_conceptos.folio=" + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                total = rst.getDouble("total");
            } else {
                total = 0.0;
                System.out.println(" NO HAY CONCEPTOS DE COMPRA O TIENEN UN COSTO VACIO O EN CEROS ");
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return total;
    }

    /**
     * ALAN GONZALEZ SUMATORIA DEL TOTAL DE CONCEPTOS
     *
     * @param folio
     * @return
     */
    public double totalMontoConceptosOrden(int folio) {
        double totalConceptos = 00.00;
        String sql = "";
        sql += " SELECT SUM(ordenes_compra_conceptos.total_concepto) ";
        sql += "  AS ";
        sql += " totalConcepto";
        sql += "  FROM ";
        sql += " ordenes_compra_conceptos";
        sql += "  WHERE";
        sql += " ordenes_compra_conceptos.folio =" + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                totalConceptos = rst.getDouble("totalConcepto");
            } else {
                totalConceptos = 00.00;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return totalConceptos;
    }

    /**
     * ALAN GONZALEZ METODO QUE SU
     *
     * @param folio
     * @return
     */
    public double totalMontoIVAConceptosOrden(int folio) {
        double totalConceptos = 00.00;
        String sql = "";
        sql += " SELECT SUM(ordenes_compra_conceptos.monto_iva) ";
        sql += " AS totalIVA";
        sql += " FROM ";
        sql += " ordenes_compra_conceptos";
        sql += " WHERE";
        sql += " ordenes_compra_conceptos.folio = " + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                totalConceptos = rst.getDouble("totalIVA");
            } else {
                totalConceptos = 00.00;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return totalConceptos;
    }

    /**
     * ALAN GONZALEZ METODO QUE ACTUALIZA EL TOTAL DEL ORDEN DE COMPRA CADA QUE
     * SE AGREGA UN CONCEPTO
     *
     * @param folio
     */
    public void actualizaTotalesOrdenCompra(int folio) {
        Herramientas cajaHerramientas = new Herramientas();

        db.openDatabase();
        String sqlTotalSinIva = "";

        sqlTotalSinIva += " update ordenes_compra ";
        sqlTotalSinIva += " set ordenes_compra.total =" + this.totalMontoConceptosOrden(folio);
        sqlTotalSinIva += " where ordenes_compra.folio = " + folio;

        db.execute(sqlTotalSinIva);
        db.closeDatabase();

        double totalIVAConceptos = this.totalMontoIVAConceptosOrden(folio);

        String sqlTotalConIva = "UPDATE ordenes_compra SET ordenes_compra.total_iva = " + totalIVAConceptos + " WHERE ordenes_compra.folio = " + folio;
        db.openDatabase();
        db.execute(sqlTotalConIva);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ | DEVUELVE UNA ORDEN DE COMPRA SEGUN SU FOLIO
     *
     * @param folio
     * @return
     */
    public OrdenCompraDTO ordenCompraPorFolio(int folio) {
        OrdenCompraDTO orden = new OrdenCompraDTO();
        PartnerDAO partner = new PartnerDAO();
        String sql = "SELECT * FROM ordenes_compra  WHERE ordenes_compra.folio = " + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                orden = result.ordenCompraDTO(rst);
                orden.setRazonSocialPartnerProveedor(this.razonSocialPrveedor(orden.getIdPartner()));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return orden;
    }

    /**
     * ALAN GONZALEZ METODO PARA ACTUALIZAR LA BADERA INDICA SI FUE ENVIADO CON
     * ANTERIORIDAD
     *
     * @param folio
     */
    public void banderaOrdenEnvio(int folio) {
        db.openDatabase();
        String sql = "UPDATE ordenes_compra SET ordenes_compra.estado = 2 WHERE ordenes_compra.folio =" + folio;
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ METODO PARA CONOCER EL NUMERO TOTAL DE CONCEPTOS QUE TIENE
     * UNA ORDEN DE COMPRA
     *
     * @param folio
     * @return
     */
    public int numeroConceptosCompra(int folio) {
        int nConceptos = 0;
        db.openDatabase();
        String sql = "SELECT COUNT(*) as total FROM ordenes_compra_conceptos WHERE ordenes_compra_conceptos.folio = " + folio;
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                nConceptos = rst.getInt("total");
            } else {
                nConceptos = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return nConceptos;
    }

    /**
     * ALAN GONZALEZ ACTUALIZA EL NUMERO DE CONCEPTOS QUE TIENE UNA ORDEN DE
     * COMPRA
     *
     * @param folio
     */
    public void actualizaNumeroConceptosOrden(int folio) {
        int numeroConceptosActual = this.numeroConceptosCompra(folio);
        db.openDatabase();
        String sql = "UPDATE ordenes_compra SET ordenes_compra.numero_conceptos = " + numeroConceptosActual + " where ordenes_compra.folio = " + folio;
        db.execute(sql);
        db.closeDatabase();
    }

    public Vector ordenesCompraFolio(int folio) {
        Vector vOrdenCompra = new Vector();
        String sql = "SELECT * FROM ordenes_compra where ordenes_compra.folio =" + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                OrdenCompraDTO o = new OrdenCompraDTO();
                o = result.ordenCompraDTO(rst);
                vOrdenCompra.add(o);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vOrdenCompra;
    }

    /**
     * ALAN GONZALEZ OBTIENE LA RAZON SOCIAL DE UN PROVEEDOR
     *
     * @param idProveedor
     * @return
     */
    public String razonSocialPrveedor(int idProveedor) {
        String razonSocial = new String();
        String sql = "select partners.razon_social as rs from partners where partners.id = " + idProveedor;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                razonSocial = rst.getString("rs");
            } else {
                razonSocial = "ND";
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return razonSocial;
    }

    /**
     * ALAN GONZALEZ METODO QUE DEVUELVE EL IVA GENERADO DEL TODOS LOS CONCEPTOS
     * DE UNA ORDENE DE COMPRA
     *
     * @param folio
     * @return
     */
    public double totalIva(int folio) {
        double tot = 0.0;
        String sql = new String();
        sql += " SELECT SUM(ordenes_compra_conceptos.monto_iva) ";
        sql += " AS";
        sql += " total ";
        sql += " FROM ";
        sql += " ordenes_compra_conceptos ";
        sql += " WHERE";
        sql += " ordenes_compra_conceptos.folio =" + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                tot = rst.getDouble("total");
            } else {
                System.out.println("error");
                tot = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return tot;
    }

    /**
     * ALAN GONZALEZ TOTAL DEL CONCEPTO DE UNA ORDEN DE COMPRA
     *
     * @param folio
     * @return
     */
    public double totalConceptos(int folio) {
        double total = 0.0;
        String sql = new String();
        sql += " SELECT SUM(ordenes_compra_conceptos.total_concepto) ";
        sql += " AS ";
        sql += " total";
        sql += " FROM ";
        sql += " ordenes_compra_conceptos ";
        sql += " WHERE ";
        sql += " ordenes_compra_conceptos.folio =" + folio;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                total = rst.getDouble("total");
            } else {
                System.out.println("error");
                total = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ComprasDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return total;
    }

    /**
     * ALAN GONZALEZ METODO PARA OBTENER EL TOTAL DE UNA COMPRA FACTURADA
     *
     * @param folio
     * @return
     */
    public double totalCompraFacturada(int folio) {
        double totalCompra = 0.0;
        double totalConceptos = this.totalConceptos(folio);
        double totalIVA = this.totalIva(folio);
        totalCompra = (totalConceptos + totalIVA);
        return totalCompra;
    }
    
    /**
     * ALAN GONZALEZ METODO PARA OBTENER EL TOTAL DE UNA COMRPRA NO FACTURADA
     * @param folio
     * @return 
     */
    public double totalCompraNOFacturada(int folio) {
        double totalCompra = 0.0;
        double totalConceptos = this.totalConceptos(folio);
        double totalIVA = 0;
        totalCompra = totalConceptos * totalIVA;
        return totalCompra;
    }
}
